package com.mcp.converter.domain.parser;

import com.mcp.converter.shared.response.analysis.BatchAnalysisResponse;
import com.mcp.converter.shared.response.analysis.CompatibilityReclassificationResult;
import com.mcp.converter.shared.response.analysis.FallbackCompatibilityResult;
import com.mcp.converter.shared.response.xml.XMLParseResult;
import com.mcp.converter.shared.response.sql.SQLLocation;

import java.util.List;

/**
 * Mybatis XML文件解析器接口
 * 用于解析Mybatis XML文件并提取其中的SQL语句
 * @author zengxiong
 */
public interface MybatisXMLParser {

    /**
     * 获取XML文件中的所有SQL语句
     * @param xmlPath XML文件路径
     * @return SQL语句列表，包含SQL语句文本和位置信息
     */
    List<SQLLocation> extractSQLStatements(String xmlPath);

    /**
     * 解析单个Mybatis XML内容
     * @param xmlContent XML内容字符串
     * @param virtualPath 虚拟路径或标识
     * @return XML解析结果
     */
    XMLParseResult parseFileContent(String xmlContent, String virtualPath);

    /**
     * 从XML文件中提取所有完整的SQL语句，提取的SQL可用于后续的兼容性分析
     * @param xmlFilePath XML文件路径
     * @return JSON格式的SQL提取结果
     */
    String extractSQLsFromXML(String xmlFilePath);

    /**
     * 鲁棒性XML解析方法，尝试多种策略解析XML内容
     * @param xmlContent XML内容
     * @param fileIdentifier 文件标识符
     * @return XML解析结果
     */
    XMLParseResult robustParseXmlContent(String xmlContent, String fileIdentifier);

    /**
     * 修复MyBatis风格SQL为标准SQL
     * @param sql 原始SQL
     * @param elementType SQL元素类型
     * @return 修复后的标准SQL
     */
    String fixMybatisSqlToStandardSql(String sql, String elementType);

    /**
     * 检查SQL语句是否完整
     * @param sqlContent SQL内容
     * @return 是否完整
     */
    boolean isSQLComplete(String sqlContent);

    /**
     * 后备兼容性检测 - 当 SQL 解析失败时，仍然检查关键不兼容函数
     * @param validSqls 有效SQL列表
     * @param batchResult 批量分析结果
     * @return 兼容性检测结果，包含不兼容函数的SQL索引集合和函数详情
     */
    FallbackCompatibilityResult performFallbackCompatibilityCheck(List<String> validSqls,
                                                                  BatchAnalysisResponse batchResult);

    /**
     * 构建SQL提取的结构化响应，包含原始SQL和修复后SQL
     * @param parseResult 解析结果
     * @param fileIdentifier 文件标识符
     * @return JSON格式的响应
     */
    String buildSQLExtractionResponseWithOriginal(XMLParseResult parseResult, String fileIdentifier);

    /**
     * 从文件路径中提取文件名
     * @param filePath 文件路径
     * @return 文件名
     */
    String extractFileNameFromPath(String filePath);

    /**
     * 预处理XML内容：去除不需要解析的标签
     * @param xmlContent XML内容
     * @return 预处理后的XML内容
     */
    String preprocessXmlContent(String xmlContent);

    /**
     * 读取XML文件内容
     * @param xmlFilePath XML文件路径
     * @return 文件内容，失败时返回null
     */
    String readXmlFileContent(String xmlFilePath);

    /**
     * 检查SQL中是否包含不兼容的函数
     * @param sql SQL内容
     * @return 是否包含不兼容的函数
     */
    boolean containsIncompatibleFunctions(String sql);

    /**
     * 智能错误重分类方法
     * 检查被标记为错误的SQL是否实际包含不兼容函数，如果是则重新分类为不兼容
     * @param batchResult 批量分析结果
     * @param validSqls 有效SQL列表
     * @return 重分类结果
     */
    CompatibilityReclassificationResult performIntelligentReclassification(BatchAnalysisResponse batchResult, List<String> validSqls);

    /**
     * 扫描指定目录下的所有XML文件
     * @param directoryPath 目录路径
     * @param recursive 是否递归扫描子目录
     * @return XML文件路径列表
     */
    List<String> scanXmlFiles(String directoryPath, boolean recursive);

    /**
    /**
     * 构建目录分析错误响应
     * @param directoryPath 目录路径
     * @param recursive 是否递归
     * @param startTime 开始时间
     * @param errorMessage 错误消息
     * @return 错误响应
     */
    String buildDirectoryAnalysisErrorResponse(String directoryPath, boolean recursive,
                                               long startTime, String errorMessage);
}
